#ifndef CONFIGSERVICE_H
#define CONFIGSERVICE_H

#include <QObject>
#include "service_global.h"
#include "config/GlobalDefine.h"
// Screenshot config model
#include "screenshot/ScreenshotConfig.h"

/**
 * @brief 配置服务类 - 简化配置访问和管理
 * 
 * 职责：
 * - 封装AppConfig的访问
 * - 提供配置验证
 * - 管理配置变更通知
 */
class SERVICE_EXPORT ConfigService : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 获取单例实例
     */
    static ConfigService& instance();

    // ========== 计时器配置 ==========
    
    /**
     * @brief 获取计时器配置
     */
    TimerConfig getTimerConfig() const;

    /**
     * @brief 设置计时器配置
     * @param config 计时器配置
     * @return 是否设置成功
     */
    bool setTimerConfig(const TimerConfig& config);

    // ========== 时间格式 ==========
    
    /**
     * @brief 获取时间格式
     */
    TimeFormat getTimeFormat() const;

    /**
     * @brief 设置时间格式
     */
    void setTimeFormat(TimeFormat format);

    // ========== 超时动作 ==========
    
    /**
     * @brief 获取超时动作配置
     */
    TimeoutAction getTimeoutAction() const;

    /**
     * @brief 设置超时动作配置
     */
    void setTimeoutAction(const TimeoutAction& action);

    // ========== 播放设置 ==========
    
    /**
     * @brief 获取播放设置
     */
    PlaybackSettings getPlaybackSettings() const;

    /**
     * @brief 设置播放设置
     */
    void setPlaybackSettings(const PlaybackSettings& settings);

    // ========== 背景设置 ==========
    
    /**
     * @brief 获取背景设置
     */
    BackgroundSettings getBackgroundSettings() const;

    /**
     * @brief 设置背景设置
     */
    void setBackgroundSettings(const BackgroundSettings& settings);

    // ========== 音频设置 ==========
    
    /**
     * @brief 获取音频设置
     */
    SoundSettings getSoundSettings() const;

    /**
     * @brief 设置音频设置
     */
    void setSoundSettings(const SoundSettings& settings);

    // Global sound controls (persisted)
    bool getGlobalMuted() const;
    void setGlobalMuted(bool);
    int getGlobalVolume() const;
    void setGlobalVolume(int);
    bool getTickEnable() const;
    void setTickEnable(bool);
    int getTickIntervalMs() const;
    void setTickIntervalMs(int);

    // ========== 字体设置 ==========
    
    /**
     * @brief 获取字体
     */
    QFont getFont() const;

    /**
     * @brief 设置字体
     */
    void setFont(const QFont& font);

    // ========== 截图设置 ==========
    ScreenshotConfig getScreenshotConfig() const;
    void setScreenshotConfig(const ScreenshotConfig& cfg);

    // ========== UI状态配置 [FDD-2025-03-015] ==========
    /**
     * @brief 获取任务面板展开状态
     */
    bool getTaskPanelExpanded() const;
    
    /**
     * @brief 设置任务面板展开状态
     * @param expanded 展开状态
     */
    void setTaskPanelExpanded(bool expanded);

    // ========== 配置管理 ==========
    
    /**
     * @brief 保存所有配置
     */
    void saveConfig();

    /**
     * @brief 重新加载配置
     */
    void reloadConfig();

    /**
     * @brief 重置为默认配置
     */
    void resetToDefaults();

    // ========== 配置验证 ==========
    
    /**
     * @brief 验证计时器配置
     * @param config 要验证的配置
     * @param errorMsg 错误信息（如果验证失败）
     * @return 是否有效
     */
    bool validateTimerConfig(const TimerConfig& config, QString* errorMsg = nullptr) const;

signals:
    /**
     * @brief 配置已改变信号
     */
    void configChanged();

    /**
     * @brief 计时器配置改变信号
     */
    void timerConfigChanged(const TimerConfig& config);

    /**
     * @brief 字体改变信号
     */
    void fontChanged(const QFont& font);

private:
    explicit ConfigService(QObject *parent = nullptr);
    ~ConfigService();

    // 禁用拷贝
    ConfigService(const ConfigService&) = delete;
    ConfigService& operator=(const ConfigService&) = delete;

    /**
     * @brief 连接AppConfig信号
     */
    void connectAppConfigSignals();
};

#endif // CONFIGSERVICE_H





